package com.changanw;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author changanw
 * @version ncc1.0
 * @description 动态代理
 * @date 2023/7/6 6:49
 */
public class ProxyDemo01 {
  public static void main(String[] args) {
    CalculatorImpl calculatorImpl = new CalculatorImpl();
    /**
     * 1.classloader
     * 2.将来生成的代理对象实现的接口/被代理对象实现的接口，
     *
     *Proxy.newProxyInstance 方法返回值其实就是生成的代理对象，这个对象是系统自动为Calculator
     * 提供的一个实现类，这个类就是（com.sun.proxy.$Proxy0）,相当于系统重，现在Calculator接口有两个实现类，一个是自动生成的
     * 一个是CalculatorImpl。
     * 我们实际上调用的是自动生成的代理对象中的 add或者minus方法。
     *
     * 自动生成的代理对象，逻辑类似于下面这样：
     * public class $Proxy0 implements Calculator{
     *   public int add(int a,int b){
     *     long s = System.nanoTime();
     *     //执行反射中的方法
     *     Object invoke = method.invoke(calculatorImpl, args);
     *     long end = System.nanoTime();
     *     System.out.println("执行方法耗时："+(end-s));
     *     return invoke;
     *   }
     *
     * }
     */
    Calculator calculator = (Calculator) Proxy.newProxyInstance(ProxyDemo01.class.getClassLoader(), new Class[]{Calculator.class}, new InvocationHandler() {
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long s = System.nanoTime();
        Object invoke = method.invoke(calculatorImpl, args);
        long end = System.nanoTime();
        System.out.println("执行方法耗时："+(end-s));
        return invoke;

      }
    });
    calculator.add(2,1);
  }
}
